音樂與音效
將準備好的音樂及音效匯入Unity中
建立一個名為 Audio 的資料夾 ➔ 將準備好的音檔拖曳至資料夾中
➔ 建立一個名為 AudioManager 的空物件
➔ 將匯入的音效檔案拖曳至 AudioManager 物件中作為其子物件
➔ 全選上述音效,並將 Play On Awake 欄位 取消勾選
主要的遊戲音樂會獨立在外面,不會收進 AudioManager 物件當中
將匯入的音檔物件重新命名會比較好分辨喔!
建立播放管理器
建立一個名為 AudioManager 的腳本,並將此腳本拖曳至 AudioManager 物件 中
➔ 開啟 AudioManager 腳本,輸入以下程式碼並存檔
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AudioManager : MonoBehaviour
{
public List<GameObject> audioList = new List<GameObject>();
void Start()
{
}
void Update()
{
}
public void playAudio(string name)
{
for (int i = 0; i < audioList.Count; i++)
{
if (audioList[i].name == name)
{
audioList[i].GetComponent<AudioSource>().Play();
}
}
}
}
➔ 回到 Unity 介面,在 AudioManager 物件 中會發現剛剛新增的 Audio List 欄位
➔ 將各個音效檔案依序拖曳至 Audio List 當中即可
設定各個音效播放的時機
開啟 PlayerController 腳本,將程式碼修改為以下版本並存檔
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
public class PlayerController : MonoBehaviour
{
public GameManager gm;
public AudioManager am;
public float currentPosY = 0;
public float speed = 0;
void Start()
{
gm = GameObject.Find("GameManager").GetComponent<GameManager>();
am = GameObject.Find("AudioManager").GetComponent<AudioManager>();
currentPosY = 0.75f;
speed = 0.1f;
}
void Update()
{
}
private void FixedUpdate()
{
if (Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.W))
{
currentPosY = currentPosY + speed;
if (currentPosY >= 5.3f)
{
currentPosY = 5.3f;
}
}
if (Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.S))
{
currentPosY = currentPosY - speed;
if (currentPosY <= -3.3f)
{
currentPosY = -3.3f;
}
}
gameObject.transform.position = new Vector3(-5.5f, currentPosY, 0f);
}
private void OnTriggerEnter(Collider collision)
{
string type = collision.gameObject.tag;
GameObject targetObject = collision.gameObject;
if (type == "rabbit")
{
Debug.Log("hit rabbit");
am.playAudio("rabbit"); // 播放rabbit音效
gm.updateRabbitPoint();
Destroy(targetObject);
}
if (type == "cookie")
{
Debug.Log("hit cookie");
am.playAudio("cookie"); // 播放cookie音效
gm.updateCookiePower();
Destroy(targetObject);
}
if (type == "big-rabbit")
{
Debug.Log("hit big-rabbit");
}
// 會扣HP的種類
if (type == "floor")
{
Debug.Log("hit floor");
if (isInvincible) return;
am.playAudio("enemy"); // 播放enemy音效
gm.updateHP(-1);
damageEffect();
}
if (type == "enemy")
{
Debug.Log("hit enemy");
if (isInvincible) return;
am.playAudio("enemy"); // 播放enemy音效
gm.updateHP(-1);
damageEffect();
}
}
void damageEffect()
{
if (isInvincible == false)
{
isInvincible = true;
hidePlayer();
Invoke("initDamageEffect", 1.2f);
}
}
bool isInvincible = false;
int hideCounter = 0;
int hideTimes = 6;
void hidePlayer()
{
if (hideCounter < hideTimes)
{
hideCounter++;
transform.GetChild(0).gameObject.SetActive(false);
Invoke("showPlayer", 0.1f);
}
}
void showPlayer()
{
transform.GetChild(0).gameObject.SetActive(true);
Invoke("hidePlayer", 0.1f);
}
void initDamageEffect()
{
isInvincible = false;
hideCounter = 0;
}
}
示意圖為 PlayerController 腳本上半部修改後之程式碼
示意圖為 PlayerController 腳本下半部修改後之程式碼